package com.jse.util.ip;

import org.nutz.lang.Strings;

public class IpUtil {

	/**
	 * <p>
	 * 判断 IP 是否存在于指定规则中<BR>
	 * 思路如下：
	 * 
	 * <pre>
	 * 1.转换 【*-】 为 【0-】；
	 * 2.转换 【-*】 为 【-255】;
	 * 3.转换 【*】  为 【0-255】;
	 * 4.去除 【[]】 为 【】
	 * 5.提取最大、最小两个IP值;
	 * 6、把 IP 转化为 Long，通过比较大小判断是否在指定规则中。
	 * </pre>
	 * 
	 * <pre>
	 * 用法如下：
	 * <OL>
	 * <LI>*.*.*.*                          代表 0.0.0.0 至 255.255.255.255
	 * <LI>192.168.0.*                      代表 192.168.0.0 至 192.168.0.255 
	 * <LI>192.168.0.[0-255]                代表 192.168.0.0 至 192.168.0.255
	 * <LI>192.168.*.[0-255]                代表 192.168.0.0 至 192.168.255.255
	 * <LI>[0-*].[*-20].*.[0-255]           代表 0.0.0.0 至 255.20.255.255
	 * <LI>[0-255].[0-255].[0-255].[0-255]  代表 0.0.0.0 至 255.255.255.255
	 * </pre>
	 * 
	 * @param pattern
	 *            IP规则
	 * @param ip
	 *            判定IP
	 * @return
	 */
	public static boolean compare(String pattern, String ip) {
		if (Strings.isBlank(pattern) || Strings.isBlank(ip)) {
			return false;
		}
		pattern = pattern.replaceAll("[^\\.]*-", "0-").replaceAll("-[^\\.]*", "-255")
				.replaceAll("[^\\.]*\\*[^\\.]*", "0-255").replace("[", "").replace("]", "");

		String minIp = pattern.replaceAll("-[^\\.]*", "");
		String maxIp = pattern.replaceAll("[^\\.]*-", "");

		Long ipValue = Long.valueOf(ipPad(ip).replace(".", ""));
		Long minValue = Long.valueOf(ipPad(minIp).replace(".", ""));
		Long maxValue = Long.valueOf(ipPad(maxIp).replace(".", ""));

		if (ipValue >= minValue && ipValue <= maxValue) {
			return true;
		}

		return false;
	}

	/**
	 * 补全 IP 地址<BR>
	 * 把 IP: 1.1.1.1 补全为 IP: 001.001.001.001<BR>
	 * 通过正则替换完成, 思路如下：
	 * 
	 * <pre>
	 * 1.IP 第   一  段,长度为 1、2 位补码；
	 * 2.IP 第 二、三 段,长度为 1、2 位补码；
	 * 3.IP 第   四  段,长度为 1、2 位补码；
	 * </pre>
	 * 
	 * @param ip
	 *            IP地址
	 * @return
	 */
	public static String ipPad(String ip) {
		if (Strings.isBlank(ip)) {
			return ip;
		}
		ip = ip.replaceAll("^(\\d)[.]", "00$1.").replaceAll("^(\\d\\d)[.]", "0$1.");
		ip = ip.replaceAll("[.](\\d)[.]", ".00$1.").replaceAll("[.](\\d\\d)[.]", ".0$1.");
		ip = ip.replaceAll("[.](\\d)$", ".00$1").replaceAll("[.](\\d\\d)$", ".0$1");
		return ip;
	}
}
